package com.doit.day05

import scala.beans.BeanProperty


//伴生类和伴生对象   class 类是object类的伴生类   object类是class类的伴生对象
//怎么定义呢？class 类和 object 类类名一样，那么就是相伴相生的
//动静分离
//他们可以互相访问对方的私有属性
//可以在object里面重写apply方法和unapply方法  apply可以调用的时候不用写方法名   unapply方法可以更好用用于模式匹配
class Dog(val id:Int,var name:String,val age:Int){
  private val price:Double = 9.9
//  Dog.color
}


object Dog{
  val gender:String = "male"
  private val color:String ="黑色"
  val bob: Dog = new Dog(1, "bob", 2)

  def apply(id: Int, name: String, age: Int): Dog = new Dog(id, name, age)

  def unapply(arg: Dog): Option[(Int, String, Int)] = Some(arg.id,arg.name,arg.age)
}

object Test002{
  def main(args: Array[String]): Unit = {
//    bob.price
//Dog.color
    val bob: Dog = new Dog(1, "bob", 2)
    val bob1: Dog = new Dog(1, "bob", 2)
    println(bob)
    println(bob1)

    val bob2: Dog = Dog(1, "bob", 2)
    val bob3: Dog = Dog(1, "bob", 2)

    println(bob2)
    println(bob3)

  }
}







//所有的东西都是非静态的
class Student(@BeanProperty
               val id:Int,
              @BeanProperty
              var name:String,
              @BeanProperty
              val age:Int,
              @BeanProperty
              var gender:String)
/*
有人数，object类是一个对象，也有人说是一个类
没有构造器
object里面所有的东西都是静态的
 */
object Teacher{
  val id:Int = 1
  var name:String ="zss"
  val age:Int = 18
  var gender:String = "male"

  def add(a:Int,b:Int)={
    a+b
  }

}


/**
 * object类里面所有的东西都是静态的
 * 里面编译的时候会生成两个class文件
 * Teacher$  :所有的成员变量，所有的方法都写在成员变量里面   静态代码块中搞了一个自己的对象，构造方法十私有化，搞一个全局唯一的对象
 * Teacher  ：写了所有的方法，方法名和Teacher$里面的方法名一样 并且所有的方法都是静态的
 */

